// esempio di overloading di funzioni
// l'overloading č un esempio di polimorfismo

#include <iostream>
using namespace std;


// valore_assoluto assume tre significati diversi grazie all'overloading
// il compilatore determina la funzione da richiamare sulla base del tipo di argomento
// il tipo e/o il numero dei parametri deve essere diverso

int valore_assoluto(int);
double valore_assoluto(double);
long valore_assoluto(long);

int main()
{
cout <<valore_assoluto(-10)<<"\n";
cout <<valore_assoluto(-11.0)<<"\n";
cout <<valore_assoluto(-9L)<<"\n";
return 0;
}

int valore_assoluto(int i)
{
cout <<"valore_assoluto() per interi\n";
return i<0 ? -i:i;
}
double valore_assoluto(double d)
{
cout <<"valore_assoluto() per double\n";
return d<0.0 ? -d:d;
}
long valore_assoluto(long l)
{
cout <<"valore_assoluto() per interi long\n";
return l<0 ? -l:l;
}

/* N.B. torneremo a parlare di overloading di funzioni e di possibili
conseguenti ambiguitā, dovute a conversioni automatiche di tipo */

/* risultato
valore_assoluto() per interi
10
valore_assoluto() per double
11
valore_assoluto() per interi long
9
Press any key to continue
*/